/**********************************************************************************************************************
 * @file    gnss_public.h
 * @author  Queclink Jason.huang
 * @date    2019-01-03
 * @brief   GNSS任务中各代码模块公用的变量，函数声明等
 *
 * Copyright (C) 2019 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 *
 * @attention
 *
 * @usage
 *
 *********************************************************************************************************************/

#ifndef __GNSS_PUBLIC_H
#define __GNSS_PUBLIC_H
/* include --------------------------------------------------------------------------------------------------------- */
#include <task_gnss.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Macro ----------------------------------------------------------------------------------------------------------- */
#define GNSS_COMM_LOSE_TIME                         (10)            /* 与模块通讯异常时间阈值 */
#define GNSS_COMM_ERR_CHG_STATE_TIME                (3)             /* 接收不到数据改变定位状态的时间阈值 */
#define GNSS_COMM_BUSY_TIME                         (2)             /* 模块接收信息过于忙碌时间阈值 */

/* gnss私有指针个数 */
#define GNSS_PRIV_NUM                               4

/* Struct ---------------------------------------------------------------------------------------------------------- */
/* 抗漂移处理 --------------------------------------------------------------- */
typedef struct {
    unsigned int        fix_delay_time;         /* 开机丢点时间 */
    unsigned char       no_fix_cnt;             /* 连续不定位计数 */
} fix_delay_t;

/* 经纬度 */
typedef struct {
    double              log;                    /* 经度 */
    double              lat;                    /* 纬度 */
} log_lat_t;

typedef struct {
    fix_delay_t         fix_delay;              /* 刚启动的丢弃时间 */
    unsigned int        cnt_2d_fix;             /* 计算连续收到的2D定位点 */
    unsigned char       no_fix_num;             /* 处理后连续不定位的点 */
    unsigned char       hdop_discard_cnt;
    unsigned char       weak_signal_cnt;
    unsigned char       strong_signal_cnt;
    /* 速度异常检测 */
    log_lat_t           ref_point;              /* 参考点,检测后认为速度正常的点 */
    unsigned int        ref_time;               /* 参考点获取时间ms */
    log_lat_t           last_point;             /* 最后一个定位点 */
    double              last_speed;             /* 最后一个定位点的速度值 */
    unsigned int        last_time;              /* 最后一个定位点获取时间ms */
    unsigned char       dist_discard_cnt;       /* 连续大距离点计数 */
}anti_drift_manage_t;

/* GNSS任务的管理参数 ------------------------------------------------------- */
/* 定位信息 */
typedef struct{
    bool            has_get_speed;          /* 本次开GPS，是否曾取得速度 */
    bool            has_get_angle;          /* 本次开GPS，是否曾取得角度值 */
    bool            speed_is_absent;        /* 消息中的速度域是否为空 */
    bool            angle_is_absent;        /* 消息中的角度域是否为空 */
    bool            is_uart_rx_ok;          /* 串口是否能收到数据，收到说明与模块的波特率匹配 */
    unsigned int    recv_uptime;            /* 接收信息的超时，确保通讯的正常，长时间未接收则通讯异常 */
    struct fix_info raw_info;               /* 实时的定位数据，未经过处理，直接从消息中获得，模块关闭后将被清空 */
    double          stderr_;                /* 实时的位置误差的标准差, 正数有效 */
}gnss_global_info_t;

/* 超时相关 */
typedef struct{
    bool            has_get_msg;            /* 是否获得有效消息 */
    unsigned int    lost_timeout;           /* 未接收到数据的超时计时 */
    unsigned int    get_timeout;            /* 未获取到有效消息的超时计时 */
    unsigned int    parse_timeout;          /*  */
    unsigned int    fix_timeout;            /* 定位超时时间 */
}gnss_comm_err_t;

enum {
    SV_GPS = 0,
    SV_GLONASS,
    SV_GALILEO,
    SV_BEIDOU,
    SV_MAX,
};

#define USABLE_SV_MAX       128      /* VIEW_SV_MAX * SV_MAX */
#define VIEW_SV_MAX         32

struct usable_sv_t {
    unsigned char   sv_num[USABLE_SV_MAX];
    unsigned char   cnt;
};

struct sat_info_single {
    unsigned int        count;              /* Number of satellites in view */
    struct satellite_t  sat[VIEW_SV_MAX];   /* 有效卫星信息 */
};

typedef struct {
    unsigned int            work_time;      /* 定位超时时间，仅单次定位模式有效GNSS_ONESHOT */
    gnss_global_info_t      gnss_info;      /* 定位信息 */
    gnss_comm_err_t         comm_err;       /* 超时相关 */
    anti_drift_manage_t     anti_drift_m;   /* 抗漂移处理 */
    struct sat_info_single  sat[SV_MAX];    /* 有效卫星信息 */
    struct usable_sv_t      usable_sv;      /* 当前使用的卫星编号 */
    unsigned char           sat_update_mask;/* 卫星信息更新标志 */

    /* 如给各种协议使用，由任务统一释放，减少任务关闭时的内存使用 */
    void                    *gnss_priv[GNSS_PRIV_NUM];
} gnss_task_manage_t;

/* 声明 ---------------------------------------------------------------------------------------------------------------- */
gnss_task_manage_t * get_gnss_manage(void);

#ifdef __cplusplus
}
#endif

#endif
